#ifndef ___fat32_main

#define ___fat32_main 1

#include <pthread.h>
#include <stdlib.h>

unsigned char fat32_centro_mensajes = 0;
unsigned int fat32_conexion_consola = 0;
unsigned int fat32_conexion_FUSE = 0;

unsigned int * fat32_conexiones_disco = NULL;
unsigned char * fat32_conexiones_ocupadas = NULL;
unsigned int fat32_cantidad_conexiones;

#include "f32_base.c"
#include "f32_conf.c"
#include "f32_cdsk.c"
#include "f32_cons.c"

#include "f32_fsbs.c"
struct bootsector_data bootsector;
#include "f32_dfs.c"

#include "f32_dfat.c"
struct fat32_contenido_FAT fat32_FAT = {NULL, 0, 0, 0, 0, 0, 0};
#include "f32_fat.c"
const long double fat32_tiempo_FAT = 0.0003;
const long double fat32_tiempo_min_FAT = 0.005;
long double fat32_tiempo_acum_FAT = 0;

const unsigned int fat32_intervalo_escritura_sectores_pendientes = 25;
unsigned int fat32_control_escritura_sectores_pendientes = 0;

#include "f32_fs.c"
#include "f32_desc.c"

#include "f32_trnc.c"
struct fat32_trans fat32_transacciones = {NULL, NULL, NULL};
unsigned int fat32_siguiente_numero_transaccion = 0;

#include "f32_bloq.c"
fat32_bloqueo * fat32_bloqueos = NULL;
unsigned int fat32_cantidad_bloqueos = 0;

#include "f32_rec.c"
struct fat32_datos_recursos fat32_recursos = {NULL, NULL, NULL, NULL, 0, 0, 0, 0};

#include "f32_cchd.c"
fat32_contenido_cache fat32_cache = {0, NULL, NULL};
fat32_sector_pendiente_escritura * fat32_lista_pendientes_escritura = NULL;
#include "f32_cch.c"

#include "f32_dles.c"
fat32_operacion_terminada * fat32_operaciones_terminadas = NULL;
unsigned int fat32_cantidad_operaciones_terminadas = 0;
#include "f32_les.c"

unsigned long long fat32_siguiente_descriptor = 0;

#include "f32_trnf.c"

#include "mtlib.c"

#include "f32_fuse.c"

#include "f32_mrep.c"
struct fat32_escrituras_recibidas_pendientes fat32_escrituras = {0, NULL};

#include "f32_pmsj.c"

#include "f32_psig.c"

#include "f32_sprc.c"

pthread_t fat32_crear_thread(unsigned char);
void * fat32_main(void *);

pthread_t fat32_crear_thread (unsigned char centroMensajesFAT32) {
  unsigned char * datos = malloc(1);
  *datos = centroMensajesFAT32;
  pthread_t threadID;
  int resultado = pthread_create(&threadID, NULL, &fat32_main, datos);
  if (resultado) return 0; else return threadID;
}

void * fat32_main (void * datos) {
  unsigned char resultado = 0;
  pthread_detach(threadID);
  fat32_centro_mensajes = *((unsigned char *) datos);
  if (!fat32_centro_mensajes) return NULL;
  free(datos);
  fat32_conexion_FUSE = fat32_obtener_conexion_FUSE();
  if (!fat32_conexion_FUSE) return NULL;
  int estado = fat32_crear_conexiones_disco();
  if (!estado) return NULL;
  fat32_fs_init();
  unsigned char cantBloquesCache = fat32_cantidad_bloques_cache();
  fat32_inicializar_cache(cantBloquesCache);
  mtf_enviar_mensaje(fat32_centro_mensajes, fat32_conexion_FUSE, MTQ_FAT32_OPERACIONAL);
  fat32_conexion_consola = fat32_conectar_consola();
  while (resultado != 255) {
    fat32_ejecutar_subprocesos(resultado);
    resultado = fat32_procesar_mensajes();
  }
  fat32_desconectar();
  return NULL;
}

#endif